/**
 * jFuns工具函数
 */
(function(window, undefined) {
    var localStorage = window.localStorage,
        location = window.location,
        console = window.console;
    //hash分割字符串
    var hash_split_char = '/';

    var Jfuns = function() {

        };

    // 事件
    Jfuns.prototype.event = {
        /**
         * 获取事件触发源
         * @param  {Object} e 触发事件对象
         * @return {Object}   事件触发源
         */
        target: function(e) {
            var targ;
            e = e || (window.event);
            if (e.target) targ = e.target;
            else if (e.srcElement) targ = e.srcElement;
            //defeat Safari bug
            if (targ.nodeType == 3) targ = targ.parentNode;
            return targ || undefined;
        },
        /**
         * 获取事件触发坐标
         * @param  {Object} e 触发事件对象
         * @return {Object}   事件触发坐标对象{x,y}，x是横坐标，y是纵坐标
         */
        coords: function(e) {
            var posx = 0;
            var posy = 0;
            e = e || (window.event);
            if (e.pageX || e.pageY) {
                posx = e.pageX;
                posy = e.pageY;
            } else if (e.clientX || e.clientY) {
                posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
                posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
            }
            return {
                x: posx,
                y: posy
            };
        },

        /**
         * 添加事件监听
         * @param  {Object} ele 事件源
         * @param  {String} name 事件名
         * @param  {Function} fun 事件函数
         * @param  {Boolean} bubble 是否冒泡
         */
        listen: function(ele, name, fun, bubble) {
            bubble = bubble || false;
            ele.addEventListener(name, fun, bubble);
        }
    };

    // 元素
    Jfuns.prototype.element = {
        /**
         * 获取元素在当前文档中的坐标
         * @param  {Object} ele 元素
         * @return {Object}     如果存在offsetParent则返回{x,y}，x表示横坐标，y表示纵坐标，否则返回null
         */
        coords: function(ele) {
            var curleft = 0,
                curtop = 0;
            if (ele.offsetParent) {
                do {
                    curleft += ele.offsetLeft;
                    curtop += ele.offsetTop;
                } while (ele = ele.offsetParent);
                return {
                    x: curleft,
                    y: curtop
                };
            }
            return null;
        }
    };

    // 本地存储
    Jfuns.prototype.storage = {
        /**
         * 检测当前浏览器是否支持本地存储
         * @return {Boolean} true表示支持
         */
        supported: function() {
            return localStorage ? true : false;
        },

        /**
         * 根据存储名获取存储值
         * @param {String} key	存储名
         * @return {String}		存储值，没有存储值返回null
         */
        get: function(key) {
            if (!this.supported) return;
            return localStorage.getItem(key);
        },

        /**
         * 添加本地存储
         * @param {String} key		存储名
         * @param {Object} value	存储值
         */
        set: function(key, vlaue) {
            if (!this.supported) return;
            localStorage.setItem(key, vlaue);
        },

        /**
         * 根据存储名移除存储值
         * @param {String} key	存储名
         */
        del: function(key) {
            if (!this.supported) return;
            localStorage.removeItem(key);
        },

        /**
         * 清空本地存储
         */
        clear: function() {
            if (!this.supported) return;
            localStorage.clear();
        }
    }

    // url
    Jfuns.prototype.url = {

        /**
         * 获取hash值
         * @param {String} hash_str	hash来源字符串，如果没有定义则获取当前页面的hash
         * @return {Array}	返回hash数组，如果没有获取到hash则数组为空
         */
        getHash: function(hash_str) {
            hash_str = hash_str || location.hash;
            var tmp = [],
                params = hash_str.split(hash_split_char),
                tmp1;
            for (var p in params) {
                tmp1 = params[p].split('=');
                if (tmp1.length == 2) {
                    tmp[tmp1[0]] = tmp1[1];
                }
            }
            return tmp;
        },

        /**
         * 设置hash值
         * @param {Array} args	hash参数
         */
        setHash: function(args) {
            var hash_str = hash_split_char;
            if (!$.isArray(args)) return;
            for (var i in args) {
                var arg = encodeURIComponent(args[i]);
                hash_str += i + '=' + arg + hash_split_char;
            }
            location.hash = hash_str;
        },

        /**
         * 获取url参数值
         * @param {String} url	只能含有参数
         * @param {String} key	参数名
         * @return {String} 返回查找到的参数值
         */
        getParam: function(url, key) {
            var reg = new RegExp("(\\?|&)" + key + "=([^&]+)(&|$)", "i")
            var m = url.match(reg);
            if (!m) return '';
            return m[2];
        },

        /**
         * 设置url参数值
         * @param {String} url	只能含有参数
         * @param {String} key	参数名
         * @param {String} value	参数值
         * @return {String} 返回新的url
         */
        setParam: function(url, key, value) {
            var reg = new RegExp("(\\?|&)" + key + "=([^&]+)(&|$)", "i")
            var m = url.match(reg);
            if (m) {
                return url.replace(reg, function($0, $1, $2) {
                    return $0.replace($2, value);
                });
            } else {
                if (url.indexOf('?') == -1) {
                    return url + '?' + key + '=' + value;
                } else {
                    return url + '&' + key + '=' + value;
                }
            }
        }

    };

    /**
     * 打印日志
     * @param {Object} text
     */
   /* JFuns.prototype.log = function(text) {
        console && console.log && console.log(text);
    };*/
    /**
     * 发送请求，gdp
     * @param {String} url	请求的图片地址
     * @param {String} params	请求的附加参数
     */
    /*JFuns.prototype.stat = function(url, params) {
        url = url + '?';
        var t = new Date().getTime();
        var obj = document.getElementById('stat');
        if (!obj) {
            obj = document.createElement('img');
            obj.style.display = 'none';
            obj.id = 'stat';
            document.body.appendChild(obj);
        }
        obj.src = url + params + '&t=' + t;
    };*/

    // 编码
    Jfuns.prototype.encode = {
        /**
         * html特殊符号编码
         * @param {String} str	要编码的html字符串
         * @return 编码后的html字符串
         */
        encode: function(str) {
            if (!str) return str;
            str = str.replace(/&/g, '&amp;');
            str = str.replace(/</g, '&lt;');
            str = str.replace(/>/g, '&gt;');
            str = str.replace(/ /g, '&nbsp;');
            str = str.replace(/\'/g, '&#39;');
            str = str.replace(/\"/g, '&quot;');
            return str;
        },

        /**
         * html特殊符号解码
         * @param {String} str	要解码的字符串
         * @return {String} 解码后的字妇产
         */
        decode: function(str) {
            if (!str) return false;
            str = str.replace(/&amp;/g, '&');
            str = str.replace(/&lt;/g, '<');
            str = str.replace(/&gt;/g, '>');
            str = str.replace(/&nbsp;/g, ' ');
            str = str.replace(/&#39;/g, '\'');
            str = str.replace(/&quot;/g, '\"');
            return str;
        }
    };
    window.jFuns = new Jfuns();
})(window, undefined);
